package Day_0214.JVM;

/**
 * @author zxc
 * @date 2023/02/14 23:31
 **/
public class MetaSpace_Runtime_Constant_Pool {
    public static void main(String[] args) {
        /**
         * 谈一谈对于JVM方法区实现-元空间中运行时常量池的理解
         * ===》
         * 理解运行时常量池，需要了解字节码文件（ClassFile）中的常量池；
         * 1.方法区内部，包含运行时常量池;字节码文件，内部包含了常量池。
         *
         * 2.首先简单说明常量池：
         * （1）一个有效的字节码文件中，除了包含类的版本信息、字段、方法以及接口等描述信息外;
         * （2）还包含一项信息，那就是常量池（ Constant Pool Table），包括各种字面量（数量值和字符串值）和对类型、域和方法的符号引用。
         * （3）常量池可以看做是一张表，虚拟机指令根据这张常量表，找到要执行的字面量、类名、方法名、参数类型等。
         *
         * 3.然后说明运行时常量池：
         * （1）运行时常量池（Runtime Constant pool）是方法区的一部分。
         * （2）常量池（Constant Pool Table）是class文件的一部分，用于存放编译期生成的各种字面量与符号引用，
         *  这部分内容将在类加载后，存放到方法区的运行时常量池中。
         * （3）在加载类和接口到虚拟机后，就会创建对应的运行时常量池。
         * （4）JVM为每个已加载的类型（类或接口），都维护一个运行时常量池，池中的数据项像数组项一样，是通过索引访问的。
         *
         * （5）运行时常量池中包含多种不同的常量，包括编译期就已经明确的数值字面量，也包括到运行期解析后，才能够获得的方法或者字段引用。
         *  此时不再是常量池中的符号地址了，会转换为真实地址。
         * （6）运行时常量池，相对于Class文件中的常量池的另一重要特征是：具备动态性。比如String.intern()方法会动态地向池中增加内容;
         * （7）运行时常量池,类似于传统编程语言中的符号表（symbol table），但是它所包含的数据比符号表要更加丰富。
         * （8）如果构造类或接口的运行时常量池时，所需的内存空间超过了方法区所能提供的最大值，则会抛出OutOfMemoryError异常。
         *
         */
    }
}
